About CDRs Sent by ARM to CDR Server
ARM Routers send CDRs (Call Detail Records) to a CDR Server. CDR messages contain information about all calls routed by the ARM, for example, source and destination users, call duration and call path. CDR messages also provide billing details. CDRs are sent as syslog packets to a predefined IP address configured by the operator. CDR syslog messages comply with RFC 3164 and are identified by Facility 17 (local1) and Severity 6 (Informational). CDR messages are built using getRoute and CallStatus_callEnd messages, by the first node in the paths. CDR types are CALL_START and CALL_END.
Calls from an SBC node:
1. | One CALL_START message is sent per route (path) |
2. | Two CALL_END messages are sent at the end of the call |
Calls from a gateway node:
1. | One CALL_START message is sent per route (path) |
2. | One CALL_END message is sent at the end of the call (not per route) |
SessionId is identical for all CDR messages related to the same call.
The routeSeq:
1. | Represents the route (path) the ARM attempts |
2. | The count starts from 0 |
3. | For example, for an SBC call, when there are three paths to attempt, the ARM sends: |
a. | First route (path): One CALL_START message and one CALL_END (outgoing leg) message. routeSeq = 0. |
b. | Second route (path): One CALL_START message and one CALL_END (outgoing leg) message. routeSeq = 1. |
c. | Third route (path): One CALL_START and two CALL_END (incoming and outgoing legs) messages. routeSeq = 2. |
The following table describes all CDR fields.
CDR Field Descriptions
CDR Field |
Description |
CDR Report Type |
Format |
||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
RouterIp |
IP address of the Router that sends the CDR. |
All |
String (15) |
||||||||||||
Seq |
Each router sends its own sequence CDR staring with 1. |
All |
String (10) |
||||||||||||
CreationDate |
The creation date of the CDR. |
All |
String (40) |
||||||||||||
CdrReportType |
Report type:
|
- |
String (13) |
||||||||||||
AppType |
Endpoint type:
|
All |
String (13) |
||||||||||||
SessionId |
Unique Session ID |
All |
String (20) |
||||||||||||
callId |
CallId of the relevant leg |
"CALL_START" – incoming leg. "CALL_END" – both legs. |
String (55) |
||||||||||||
direction |
Direction of the call: Incoming or Outgoing |
"CALL_START" |
String (10) |
||||||||||||
pconOrConnectionName |
Pcon or connection name |
All |
String (35) |
||||||||||||
nodeId |
ARM node database ID address |
All |
String (11) |
||||||||||||
nodeName |
Node name as described in the GUI |
All |
String (25) |
||||||||||||
nodeIp |
Node IP address |
All |
String (20) |
||||||||||||
pconId |
Pcon database ID |
"CALL_START" |
String (10) |
||||||||||||
conId |
Connection database ID |
"CALL_START" |
String (10) |
||||||||||||
pconOrConnectionType |
Pcon or connection type |
"CALL_START" |
String (25) |
||||||||||||
outPconId |
Outgoing Peer Connection database ID |
"CALL_START" |
String (10) |
||||||||||||
outConId |
Outgoing Connection database ID |
"CALL_START" |
String (10) |
||||||||||||
outPconOrConType |
Outgoing leg type |
"CALL_START" |
String (25) |
||||||||||||
lastNodeId |
ID of the last node |
"CALL_START" |
String (10) |
||||||||||||
lastNodeName |
Name of the last node |
"CALL_START" |
String (25) |
||||||||||||
lastPconId |
ID of the last Peer Connection |
"CALL_START" |
String (10) |
||||||||||||
lastPconName |
Name of the last Peer Connection |
"CALL_START" |
String (35) |
||||||||||||
srcUri |
Source URI as actually sent (after manipulation). |
All |
String (50) |
||||||||||||
srcUriBeforeMap |
Source before manipulation. |
"CALL_START" |
String (50) |
||||||||||||
from |
From URI as actually sent (after manipulation). |
"CALL_START" |
String (50) |
||||||||||||
fromBeforeMap |
From URI before manipulation. |
"CALL_START" |
String (50) |
||||||||||||
pai |
P-Asserted-Identity URI as actually sent (after manipulation). |
"CALL_START" |
String (50) |
||||||||||||
paiBeforeMap |
P-Asserted-Identity URI before manipulation. |
"CALL_START" |
String (50) |
||||||||||||
ppi |
P-Preferred-Identity URI as actually sent (after manipulation). |
"CALL_START" |
String (50) |
||||||||||||
ppiBeforeMap |
P-Preferred-Identity URI before manipulation. |
"CALL_START" |
String (50) |
||||||||||||
dstUri |
Destination URI as actually sent (after manipulation). |
All |
String (50) |
||||||||||||
dstUriBeforeMap |
Destination before manipulation. |
"CALL_START" |
String (50) |
||||||||||||
armSetupTime |
ARM Router time when sending CALL_START. |
"CALL_START" |
String (30) |
||||||||||||
armReleaseTime |
ARM Router time when sending CALL_END. |
"CALL_END" |
String (30) |
||||||||||||
sbcSetupTime |
Gateway / SBC time when start handling Invite message. |
"CALL_END" |
String (40) |
||||||||||||
sbcConnectTime |
Gateway / SBC time when 200 OK response (i.e., call is established) |
"CALL_END" |
String (40) |
||||||||||||
sbcReleaseTime |
Gateway / SBC time when a BYE message (i.e., call ends) |
"CALL_END" |
String (40) |
||||||||||||
sbcAlertTime |
Gateway / SBC time when start ringing |
"CALL_END" |
String (40) |
||||||||||||
alertDuration |
Time of ringing in milliseconds (should be configured in the SBC /gateway to send in milliseconds) |
"CALL_END" |
String (13) |
||||||||||||
voiceDuration |
Time of voice streamed in milliseconds (should be configured in the SBC /Gateway to send in milliseconds) |
"CALL_END" |
String (13) |
||||||||||||
completeDuration |
Time of the whole call in milliseconds (from the first incoming Invite until ending the call) |
"CALL_END" |
String (16) |
||||||||||||
sipTerminationReason |
SIP termination reason |
"CALL_END" |
String (20) |
||||||||||||
sipTerminationReasonDesc |
SIP termination reason – more detailed |
"CALL_END" |
String (35) |
||||||||||||
routeSeq |
Each route (path) of a call has a number. Starting from 0. |
"CALL_START" |
String (8) |
||||||||||||
sipInterface |
sipInterface ID of the Connection or Peer Connection in the SBC / Gateway |
"CALL_START" |
String (20) |
||||||||||||
legId |
Leg id of the SBC / Gateway |
"CALL_END" |
String (11) |
||||||||||||
routingRuleId |
The Routing Rule ID of the match rule |
"CALL_START" |
String (13) |
||||||||||||
routingRuleName |
The Routing Rule name of the match rule |
"CALL_START" |
String (30) |
||||||||||||
discardingByRoutingRule |
The Routing Rule ID in case of discarding rule |
"CALL_START" |
String (24) |
||||||||||||
continueWithNodeInternalTablesByRoutingRule |
Stop ARM routing and continue with node’s internal routing |
"CALL_ START" |
String (44) |
||||||||||||
fork |
Is a fork call |
"CALL_ START" |
String (5) |
||||||||||||
Path |
String – describes the path. |
"CALL_START" |
String (200) |
Two CDR format options are available:
■ | Clear text (separating each value with “|”) |
■ | As JSON |
Here's an example of an ARM signaling CDR as clear text, sent at the end of a call (which was terminated normally):
Format:
|routerIp|seq|creationDate|cdrReportType|appType|sessionId|callId|direction
|pconOrConName |nodeId|nodeName|nodeIp|pconId|conId|pconOrConType|sipInterface
|outPconId|outConId|outPconOrConType|lastPconId|lastNodeId|lastNodeName |lastPconName|srcUri|srcUriBeforeMap|from|fromBeforeMap|pai|paiBeforeMap
|ppi|ppiBeforeMap|dstUri|dstUriBeforeMap|armSetupTime|armReleaseTime
|sbcSetupTime |sbcConnectTime|sbcReleaseTime|sbcAlertTime|alertDuration
|voiceDuration |completeDuration|sipTerminationReason|sipTerminationReasonDesc|routeSeq |legId|routingRuleId|routingRuleName|discardingByRoutingRule
|continueWithNodeInternalTablesByRoutingRule |fork |path
Value:
|10.7.6.102|4|2020-12-06T09:21:23.729Z|CALL_START|SBC|33a4b1cfb37733a5
|1-24960@10.7.20.148|RMT|SIPP|1|SBC_102|10.7.12.102|70|null|IPGroup|SIPP|null
|1|IPGroup|71|3|Hybrid_96|SIPP |401@10.7.20.148 |123456@10.7.20.148|||||||sipp201@10.7.12.102 |sipp201@10.7.12.102 |2020-12-06T09:21:23.728Z|||||| |0||| |0 |-1 |47 |src_uri |-1|-1|false|IncomingLeg=[nodeId=1,nodeName=SBC_102,pconId=70,pconOrConnectionName=SIPP], Outgoing Leg=[nodeId=3,nodeName=Hybrid_96,pconId=71,pconOrConnectionName=SIPP], Edges=[Edge [connSrcNode=1, connDestNode=5, connectionId=1], Edge [connSrcNode=5, connDestNode=3, connectionId=2]]]
Here's an example of an ARM signaling CDR as JSON, sent at the end of a call (that was terminated normally):
jsonCdr={"creationDate":"2020-12-06T09:21:23.729Z","sessionKey":"1_33a4b1cfb37733a5","routerIp":"10.7.6.102","routerId":10,"seq":4,"cdrReportType":"CALL_START","cdrApplicationType":"SBC","sessionId":"33a4b1cfb37733a5","callId":"1-24960@10.7.20.148","callOrig":"RMT","pconOrConName":"SIPP","nodeId":"1",
"nodeName":"SBC102","nodeIp":"10.7.12.102","pconId":70,"conId":null,
"pconOrConType":"IPGroup","sipInterface":"SIPP","outPconId":null,"outConId":1,
"outPconOrConType":"IPGroup","lastPconId":71,"lastNodeId":3,
"lastNodeName":"Hybrid96","lastPconName":"SIPP","srcUri":"401@10.7.20.148",
"srcUriBeforeMap":"123456@10.7.20.148","from":"","fromBeforeMap":"","pai":"",
"paiBeforeMap":"","ppi":"","ppiBeforeMap":"","dstUri":"sipp201@10.7.12.102",
"dstUriBeforeMap":"sipp201@10.7.12.102","armSetupTime":"2020-12-06T09:21:23.728Z",
"armReleaseTime":"","sbcSetupTime":"","sbcConnectTime":"","sbcReleaseTime":"",
"sbcAlertTime":"","alertDuration":"","voiceDuration":"0","completeDuration":"",
"sipTerminationReason":"","sipTerminationReasonDesc":"","routeSeq":0,"legId":-1,"routingRuleId":47,"routingRuleName":"src_uri","path":"Incoming Leg=[nodeId=1,nodeName=SBC_102,pconId=70,pconOrConnectionName=SIPP], Outgoing Leg=[nodeId=3,nodeName=Hybrid_96,pconId=71,pconOrConnectionName=SIPP], Edges=[Edge [connSrcNode=1, connDestNode=5, connectionId=1], Edge [connSrcNode=5, connDestNode=3, connectionId=2]]]","discardingByRoutingRule":-1, "continueWithNodeInternalTablesByRoutingRule":-1,"fork":false,"httpResponse":200,"description":""}